﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOClientesCiudades
    /// </summary>
    class DAOIMPLClientesCiudades:Presupuesto_DAO.DAOClientesCiudades
    {
        /// <summary>
        /// Guarda un cliente asociado a una ciudad
        /// </summary>
        /// <param name="idCliente">Determina el cliente</param>
        /// <param name="idCiudad">Determina la ciudad</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveClienteCiudad(int idCliente, int idCiudad)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO cliente_ciudad(id_cliente, id_ciudad) VALUES(@idCliente, @idCiudad)";
                insertar.Parameters.AddWithValue("@idCliente", idCliente);
                insertar.Parameters.AddWithValue("@idCiudad", idCiudad);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un cliente asociado a una ciudad
        /// </summary>
        /// <param name="idCliente">Determina el cliente</param>
        /// <param name="idCiudad">Determina la ciudad</param>
        /// <param name="id">Determina la relación a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateClienteCiudad(int idCliente, int idCiudad, int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE cliente_ciudad SET id_cliente = @idCliente, id_ciudad = @idCiudad WHERE id = @id";
                modificar.Parameters.AddWithValue("@idCliente", idCliente);
                modificar.Parameters.AddWithValue("@idCiudad", idCiudad);
                modificar.Parameters.AddWithValue("@id", id);
                modificar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un cliente y una ciudad asociada
        /// </summary>
        /// <param name="id">Determina la relación a eliminar</param>
        /// <returns>Devuelve true si fue eliminada correctamente o false si falló</returns>
        public bool deleteClienteCiudad(int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE cliente_ciudad SET Activo = @activo WHERE id = @id";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@id", id);
                eliminar.ExecuteNonQuery();
                correcto = true;
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los clientes y la ciudad
        /// </summary>
        /// <returns>Devuelve una tabla con todos los clientes</returns>
        public DataTable getAllClienteCiudad()
        {
            DataTable clientes_ciudades = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            
            try
            {
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT cc.id, c.Nombre, c.Direccion,c.Contacto, c.Mail, c.Cuit, ciu.Nombre AS Ciudad, ciu.CodPostal, p.Nombre AS Provincia, pa.Nombre AS Pais, c.Activo FROM cliente_ciudad cc "
                                    + "INNER JOIN clientes c ON cc.id_cliente = c.id "
                                    + "INNER JOIN ciudades ciu ON cc.id_ciudad = ciu.id "
                                    + "INNER JOIN provincias p ON p.id = ciu.id_provincia "
                                    + "INNER JOIN paises pa ON pa.id = p.id_pais";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(clientes_ciudades);
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                clientes_ciudades = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return clientes_ciudades;
        }

        /// <summary>
        /// Obtiene un cliente y su ciudad
        /// </summary>
        /// <param name="id">Determina el cliente a obtener</param>
        /// <returns>Devuelve un objeto clienteCiudad</returns>
        public clientesCiudades getClienteCiudad(int id)
        {
            clientesCiudades cc = new clientesCiudades();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT cc.id, c.Nombre, c.Direccion,c.Contacto, c.Mail, c.Cuit, ciu.Nombre AS Ciudad, ciu.CodPostal, p.Nombre AS Provincia, pa.Nombre AS Pais, c.Activo FROM cliente_ciudad cc "
                                    + "INNER JOIN clientes c ON cc.id_cliente = c.id "
                                    + "INNER JOIN ciudades ciu ON cc.id_ciudad = ciu.id "
                                    + "INNER JOIN provincias p ON p.id = ciu.id_provincia "
                                    + "INNER JOIN paises pa ON pa.id = p.id_pais WHERE cc.id = @id";
                consulta.Parameters.AddWithValue("@id", id);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    cc.ID = Convert.ToInt16(lector["id"].ToString());
                    cc.Activo = Convert.ToBoolean(lector["Activo"].ToString());
                    cc.Ciudad = lector["Ciudad"].ToString();
                    cc.CodPostal = lector["codPostal"].ToString();
                    cc.Contacto = lector["Contacto"].ToString();
                    cc.Cuit = lector["Cuit"].ToString();
                    cc.Direccion = lector["Direccion"].ToString();
                    cc.Mail = lector["Mail"].ToString();
                    cc.Nombre = lector["Nombre"].ToString();
                    cc.Pais = lector["Pais"].ToString();
                    cc.Provincia = lector["Provincia"].ToString();
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                cc = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return cc;
        }
    }
}
